#ifndef GENERATEMODEL_H_JM_20130228
#define GENERATEMODEL_H_JM_20130228

#include "InputBoxConfiguration.h"

namespace jm4bbx {

	std::string generateAggregationFunctionModel(
		const int N, // parallelism level
		const std::string& lineEnd,
		const std::string& inputBoxName,
		const InputBoxConfiguration& inpBoxConf,
		const std::string& aggFunBoxName,
		const std::string& resultBoxName,
		const std::string& outputBoxName);

	std::string generateArithmeticOperationModel(
		const int N, // parallelism level
		const std::string& lineEnd,
		const std::string& inputBoxName,
		const InputBoxConfiguration& firstInpBoxConf,
		const InputBoxConfiguration& secondInpBoxConf,
		const std::string& operationBoxName,
		const std::string& outputBoxName,
		const std::string& typeName);

	std::string generateOneStepOnePassDbOperationModel(
		const int N, // parallelism level
		const std::string& lineEnd,
		const std::string& inputBoxName,
		const InputBoxConfiguration& inpBoxConf,
		const std::string& actionBoxName,
		const std::string& outputBoxName,
		const std::string& outputForm,
		const std::string& typeName);

	std::string generateTwoStepOnePassDbOperationModel(
		const int N, // parallelism level
		const std::string& lineEnd,
		const std::string& inputBoxName,
		const InputBoxConfiguration& firstInpBoxConf,
		const InputBoxConfiguration& secondInpBoxConf,
		const std::string& hashBoxName,
		const std::string& actionBoxName,
		const std::string& outputBoxName,
		const std::string& outputForm,
		const std::string& typeName,
		const bool bagVersion);

	std::string generateThreeStepOnePassDbOperationModel(
		const int N, // parallelism level
		const std::string& lineEnd,
		const std::string& inputBoxName,
		const InputBoxConfiguration& firstInpBoxConf,
		const InputBoxConfiguration& secondInpBoxConf,
		const std::string& hashBoxName,
		const std::string& actionBoxName,
		const std::string& outputBoxName,
		const std::string& outputForm,
		const std::string& typeName,
		const bool bagVersion,
		const std::string& resultCreatorBoxName);

	std::string generateExperimentalModel(
		const int N, // parallelism level
		const std::string& lineEnd,
		const std::string& inputBoxName,
		const InputBoxConfiguration& firstInpBoxConf,
		const InputBoxConfiguration& secondInpBoxConf,
		const std::string& operationBoxName,
		const std::string& outputBoxName,
		const std::string& outputForm,
		const std::string& typeName,
		const bool bagVersion);
} // namespace jm4bbx

#endif
